#!/bin/bash

################################################################################
# 脚本名称：get_local_ip.sh
# 功能描述：
#   本脚本用于获取本地IP地址，集成多种方法，全面测试每种方法的输出结果。
#   主要方法包括：
#     1. ifconfig + awk
#     2. ip addr + grep + awk
#     3. hostname -I
#     4. ip route get + grep + awk
#
# 使用方法：
#   直接运行脚本：
#       ./get_local_ip.sh
#
#   查看帮助信息：
#       ./get_local_ip.sh -h
################################################################################

#########################
# 获取本地IP的方法
#########################

# 方法1：使用 ifconfig + awk
# 原理：
#   通过 ifconfig 命令获取网络接口的 IP 地址，提取带有 "inet" 字段的行。
#   使用 awk 提取第二个字段（IP 地址）。
get_ip_method1() {
    ifconfig $(ip route | awk '/default/ { print $5 }') \
        | grep "inet " | awk '{print $2}'
}

# 方法2：使用 ip addr + grep + awk
# 原理：
#   通过 ip addr 显示网络接口信息，筛选出状态为 UP 的接口。
#   使用 tail 和 awk 提取 IP 地址部分。
get_ip_method2() {
    ip addr | grep 'state UP' -A2 | tail -n1 \
        | awk '{print $2}' | cut -f1 -d'/'
}

# 方法3：使用 hostname -I
# 原理：
#   通过 hostname -I 命令直接获取所有本地 IP 地址，取第一个即可。
get_ip_method3() {
    hostname -I | cut -d' ' -f1
}

# 方法4：使用 ip route get + grep + awk
# 原理：
#   通过 ip route get 命令获取网关信息，筛选出 src 字段的 IP 地址。
get_ip_method4() {
    ip route get $(ip route show 0.0.0.0/0 \
        | grep -oP 'via \K\S+') | grep -oP 'src \K\S+'
}

#########################
# 帮助信息
#########################
usage() {
    echo "用法: $0"
    echo "直接运行脚本显示本地IP地址。"
    echo "示例: $0"
}

#########################
# 主函数
#########################
main() {
    if [[ "$1" == "-h" || "$1" == "--help" ]]; then
        usage
        exit 0
    fi

    methods=(get_ip_method1 get_ip_method2 get_ip_method3 get_ip_method4)
    for method in "${methods[@]}"; do
        ip=$($method)
        echo "本地IP地址：$ip (方法：$method)"
    done
}

main "$@"
